#include<bits/stdc++.h>
#define int long long
namespace IO{
    template<typename T>
    void read(T &x){
        char ch=getchar();int fl=1;x=0;
        while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getchar();}
        while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
        x*=fl;
    }
    template<typename T,typename ...Args>
    void read(T &x,Args& ...args){
        read(x);read(args...);
    }
    template <typename _Tp>
    void write(_Tp x) {
        if(x<0) x=(~x+1),putchar('-');
        if(x>9) write(x/10);
        putchar(x%10+'0');
    }
}
using namespace std;
using namespace IO;
const int N=2e5+5,mod=998244353;
int n,m,c[N],t[N],w[N],f[N];
struct Node {int num,t,w;};
vector<Node> vec;  
signed main() {
#ifndef KAxdd
#ifndef ONLINE_JUDGE
    freopen("book.in","r",stdin);
    freopen("book.out","w",stdout);
#endif
#endif
    read(n);
    for(int i=1;i<=n;i++) read(c[i]);
    for(int i=1;i<=n;i++) read(t[i]);
    for(int i=1;i<=n;i++) read(w[i]);
    read(m);
    for(int i=1;i<=n;i++) {
        while(c[i]) {
            for(int j=0;j<=30;j++) {
                if(c[i]<(1<<j)) break;
                vec.push_back({1<<j,t[i],w[i]});
                c[i]-=(1<<j);
            }
        }
    }
    if(vec.size()<=20) {
        int Ans=0;
        for(int i=0;i<(1<<vec.size());i++) {
            int sum=0,cnt=0;       
            for(int j=0;j<vec.size();j++) {
                if(!(i&(1<<j))) continue;
                sum+=vec[j].num*vec[j].w;
                cnt+=vec[j].num*vec[j].t;
            }
            if(cnt<=m) Ans=max(Ans,sum);
        }
        printf("%lld\n",Ans);
        return 0;
    }
    for(auto i:vec) {
        for(int j=m;j>=i.num*i.t;j--) {
            f[j]=max(f[j],f[j-i.num*i.t]+i.num*i.w);
        }
    }
    printf("%lld\n",f[m]);
    return 0;
}
/*
可以发现其变成了一个求240个物品的背包问其答案。
还有一个问题就是t较小较小有什么作用吗？
还发现了这个只能得到40分，但没有用到的仍旧是t小。
也就是时间不同的只有80种。


首先可以发现本质上是 O(n^2) dp
*/